
import java.util.HashMap;

class Solution {
    public int minNumberOfFrogs2(String croakOfFrogs) {
        // 存储青蛙的叫声与此时的青蛙数量
        HashMap<Character, Integer> hash = new HashMap<>();
        hash.put('c', 0);
        hash.put('r', 0);
        hash.put('o', 0);
        hash.put('a', 0);
        hash.put('k', 0);
        // 遍历叫声，数青蛙
        char[] str = croakOfFrogs.toCharArray();
        int count = 0;
        for (int i = 0; i < str.length; i++) {
            char ch = str[i];
            // 判断当前字符的情况：
            // 1、起始字符，就看结束字符的数量；
            // 2、如果是中间字符，就看前一个字符的数量
            if (ch == 'c') {
                if (hash.getOrDefault('k', 0) != 0) { // 有空闲的青蛙
                    // 当前叫声的青蛙数++，空闲青蛙数--
                    hash.replace('c', hash.getOrDefault('c', 0)+1);
                    hash.replace('k', hash.get('k')-1);
                } else { // 没有空闲的青蛙，只能是新来了青蛙
                    hash.put('c', hash.getOrDefault('c', 0)+1);
                    count++;
                }
            } else if (ch == 'r') {
                // 判断是否有前一个字符
                if (hash.getOrDefault('c', 0) != 0) {
                    hash.replace('c', hash.get('c')-1);
                    hash.replace('r', hash.getOrDefault('r', 0)+1);
                } else {
                    return -1;
                }
            } else if (ch == 'o') {
                if (hash.getOrDefault('r', 0) != 0) {
                    hash.replace('r', hash.get('r')-1);
                    hash.replace('o', hash.getOrDefault('o', 0)+1);
                } else {
                    return -1;
                }
            } else if (ch == 'a') {
                if (hash.getOrDefault('o', 0) != 0) {
                    hash.replace('o', hash.get('o')-1);
                    hash.replace('a', hash.getOrDefault('a', 0)+1);
                } else {
                    return -1;
                }
            } else if (ch == 'k') {
                if (hash.getOrDefault('a', 0) != 0) {
                    hash.replace('a', hash.get('a')-1);
                    hash.replace('k', hash.getOrDefault('k', 0)+1);
                } else {
                    return -1;
                }
            } else { // 不是青蛙的叫声
                return -1;
            }
        }
        // 判断哈希表中是否还有剩余青蛙处于"叫"的状态
        // 这是通过测试用例排除出来的，为了偷懒只写了一部分，正常要把前面的叫声全部判断一遍
        if (hash.getOrDefault('a', 0) != 0 || hash.getOrDefault('c', 0) != 0) {
            return -1;
        }
        return count;
    }

    public int minNumberOfFrogs(String croakOfFrogs) {
        // 使用数组来记录当前叫声位置的青蛙数
        int[] count = new int[5];
        // 使用哈希表来记录索引
        HashMap<Character, Integer> hash = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            hash.put("croak".charAt(i), i);
        }
        // 遍历叫声字符串
        int len = croakOfFrogs.length();
        char[] str = croakOfFrogs.toCharArray();
        for (int i = 0; i < len; i++) {
            // 判断当前字符是c字符，还是其他字符
            // 题目说了，不会出现其他无关字符，因此我们可以不用判断
            char ch = str[i];
            if (ch == 'c') {
                // 判断是否是剩余青蛙在叫
                if (count[hash.get('k')] != 0) {
                    count[hash.get('k')]--;
                }
                count[hash.get('c')]++;
            } else {
                // 判断是否有处于前一个叫声的青蛙
                if (count[hash.get(ch)-1] == 0) { // 注意这里的写法
                    return -1;
                }
                // 前一个叫声的青蛙数--，当前叫声的青蛙数++
                count[hash.get(ch)-1]--;
                count[hash.get(ch)]++;
            }
        }
        // 判断剩余叫声中是否有青蛙数，如果有，则不是青蛙叫声
        for (int i = 0; i < 5; i++) {
            if (count[i] != 0) {
                // 返回处于k位置的青蛙数即可
                return i == 4 ? count[i] : -1;
            }
        }
        return -1; // 这里只是为了通过编译
    }
}